<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Struct template when</title>
<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../../proto/reference.html#header.boost.proto.transform.when_hpp" title="Header &lt;boost/proto/transform/when.hpp&gt;">
<link rel="prev" href="transforms.html" title="Global transforms">
<link rel="next" href="when_Gra_1_3_34_5_52_2_1_4.html" title="Struct template when&lt;Grammar, Fun *&gt;">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
<td align="center"><a href="../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="transforms.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../proto/reference.html#header.boost.proto.transform.when_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="when_Gra_1_3_34_5_52_2_1_4.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="refentry">
<a name="boost.proto.when"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2><span class="refentrytitle">Struct template when</span></h2>
<p>boost::proto::when — A grammar element and a <a class="link" href="../../PrimitiveTransform.html" title="Concept PrimitiveTransform">PrimitiveTransform</a> that associates
          a transform with the grammar.</p>
</div>
<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: &lt;<a class="link" href="../../proto/reference.html#header.boost.proto.transform.when_hpp" title="Header &lt;boost/proto/transform/when.hpp&gt;">boost/proto/transform/when.hpp</a>&gt;

</span><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> Grammar<span class="special">,</span> <span class="keyword">typename</span> <a class="link" href="../../PrimitiveTransform.html" title="Concept PrimitiveTransform">PrimitiveTransform</a> <span class="special">=</span> <span class="identifier">Grammar</span><span class="special">&gt;</span> 
<span class="keyword">struct</span> <a class="link" href="when.html" title="Struct template when">when</a> <span class="special">:</span> <span class="keyword"></span> PrimitiveTransform <span class="special">{</span>
  <span class="comment">// types</span>
  <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Grammar</span><span class="special">::</span><span class="identifier">proto_grammar</span> <a name="boost.proto.when.proto_grammar"></a><span class="identifier">proto_grammar</span><span class="special">;</span>
<span class="special">}</span><span class="special">;</span></pre></div>
<div class="refsect1">
<a name="id-1.3.34.5.54.6.4"></a><h2>Description</h2>
<p>
            Use <code class="computeroutput">proto::when&lt;&gt;</code> to override a grammar's default
            transform with a custom transform. It is for used when composing larger transforms by
            associating smaller transforms with individual rules in your grammar, as in the following
            transform which counts the number of terminals in an expression.
            </p>
<pre class="programlisting"><span class="comment">// Count the terminals in an expression tree.</span>
<span class="comment">// Must be invoked with initial state == mpl::int_&lt;0&gt;().</span>
<span class="keyword">struct</span> <span class="identifier">CountLeaves</span> <span class="special">:</span>
  <a class="link" href="or_.html" title="Struct template or_">proto::or_</a><span class="special">&lt;</span>
    <span class="identifier">proto</span><span class="special">::</span><span class="identifier">when</span><span class="special">&lt;</span><a class="link" href="terminal.html" title="Struct template terminal">proto::terminal</a><span class="special">&lt;</span><a class="link" href="_.html" title="Struct _">proto::_</a><span class="special">&gt;</span><span class="special">,</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">next</span><span class="special">&lt;</span><a class="link" href="_state.html" title="Struct _state">proto::_state</a><span class="special">&gt;</span><span class="special">(</span><span class="special">)</span><span class="special">&gt;</span><span class="special">,</span>
    <span class="identifier">proto</span><span class="special">::</span><span class="identifier">otherwise</span><span class="special">&lt;</span><a class="link" href="fold.html" title="Struct template fold">proto::fold</a><span class="special">&lt;</span><a class="link" href="_.html" title="Struct _">proto::_</a><span class="special">,</span> <a class="link" href="_state.html" title="Struct _state">proto::_state</a><span class="special">,</span> <span class="identifier">CountLeaves</span><span class="special">&gt;</span> <span class="special">&gt;</span>
  <span class="special">&gt;</span>
<span class="special">{</span><span class="special">}</span><span class="special">;</span></pre>
<p>
          </p>
<p>
            In <code class="computeroutput">proto::when&lt;G, T&gt;</code>, when <code class="computeroutput">T</code>
            is a class type it is a <a class="link" href="../../PrimitiveTransform.html" title="Concept PrimitiveTransform">PrimitiveTransform</a> and the following equivalencies hold:
          </p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem"><p>
                <code class="computeroutput">boost::result_of&lt;proto::when&lt;G,T&gt;(E,S,V)&gt;::type</code> is the same as
                <code class="computeroutput">boost::result_of&lt;T(E,S,V)&gt;::type</code>.
              </p></li>
<li class="listitem"><p>
                <code class="computeroutput">proto::when&lt;G,T&gt;()(e,s,d)</code> is the same as
                <code class="computeroutput">T()(e,s,d)</code>.
              </p></li>
</ul></div>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2008 Eric Niebler<p>
        Distributed under the Boost Software License, Version 1.0. (See accompanying
        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
      </p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="transforms.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../proto/reference.html#header.boost.proto.transform.when_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="when_Gra_1_3_34_5_52_2_1_4.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
